/*
 * 根据配置文件生成bean类
 *
 * VERSION  DATE        BY              REASON
 * -------- ----------- --------------- ------------------------------------------
 * 1.00     2014.07.24  wuxiaogang      程序・发布
 * -------- ----------- --------------- ------------------------------------------
 * Copyright 2014 easycode System. - All Rights Reserved.
 *
 */
package cn.com.softvan.easycode.utils;

import java.io.File;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.List;

import cn.com.softvan.common.StrUtils;
import cn.com.softvan.common.Validator;
import cn.com.softvan.easycode.bean.ColumsBean;
import cn.com.softvan.easycode.bean.ConfigBean;
import cn.com.softvan.easycode.bean.TableBean;
/**
 * 根据配置文件生成bean类
 * @author wuxiaogang 
 *
 */
public class BeanUtils {
	/**
	 * 生成
	 * @param config
	 * @return
	 */
	public static StringBuffer toFile(ConfigBean config){
		StringBuffer csb=new StringBuffer("");
		try {
			if(null==config){
				return csb;
			}
			//TODO 获取表列表
			List<TableBean> tables=config.getTables();
			if(null==tables){
				return csb;
			}
			for(TableBean table:tables){
				try {
					//类名
					String className="";
					//是否生成bean 0否 1是
					String isBean=config.getIsBean();
					if(Validator.notEmpty(table.getIsBean())){
						isBean=table.getIsBean();
					}
					if("0".equals(isBean)){
						continue;
					}
					//存放bean属性内容
					StringBuffer sb=new StringBuffer("");
					//TODO ---1-----版本注释 --2---依赖包引入---类功能注释----
					sb.append(HeaderUtils.getHeader(config, "BEAN类", table,1));
					//TODO ---3----创建类
					sb.append("\n");
					sb.append("public class ");
					if(Validator.isEmpty(table.getClassName())){
						className=StrUtils.toUpperCase(StrUtils.getRidprefixTableName(config.getRidprefixlen(),table.getTableName()),"_")+"Bean";
					}else{
						className=table.getClassName()+"Bean";
					}
					sb.append(className);
					
					//-//TODO--3.1--继承----3.2--接口实现----
					sb.append(HeaderUtils.setExtendsAndimplements(config, table, 1));
					
					//--
					sb.append("{\n");
					//--序列号--
					sb.append("\n\tprivate static final long serialVersionUID = -"+HeaderUtils.getbigInt()+"L;");
					
					//TODO 获取表字段列表
					List<ColumsBean> columsBeans=table.getColums();
					if(columsBeans==null){
						columsBeans=new ArrayList<ColumsBean>();
					}
					//-----1-字段列表------
					for(ColumsBean colums:columsBeans){
						if(config.getBaseColumns()!=null && config.getBaseColumns().contains(StrUtils.toLowerCase(colums.getColumsName()))){
							continue;
						}
						//字段注释
						sb.append("\n\t/**"+colums.getColumsNote());
						if(Validator.notEmpty(colums.getColumsValue())){
							sb.append("  默认值("+colums.getColumsValue()+")");
						}
						sb.append(" */");
						sb.append("\n\tprivate String "+StrUtils.toLowerCaseFirstOne(HeaderUtils.getStr(config.getIsformat(),colums.getColumsName()))+";");
					}
					//-----2--字段get set------
					for(ColumsBean colums:columsBeans){
						if(config.getBaseColumns()!=null && config.getBaseColumns().contains(StrUtils.toLowerCase(colums.getColumsName()))){
							continue;
						}
						//--2.1--设定----
						sb.append(HeaderUtils.setInfo(config,colums.getColumsName(), colums.getColumsNote(), colums.getColumsValue(), "String"));
						//--2.2--取得----
						sb.append(HeaderUtils.getInfo(config,colums.getColumsName(), colums.getColumsNote(), colums.getColumsValue(), "String"));
					}
					sb.append("\n}");
					//文件保存路径 项目根目录+包路径+类名称
					String fileurl=config.getJavaDirUrl()+config.getBeanPackage().replace(".", "/");
					//创建文件夹
			    	File saveDirFile = new File(fileurl);
			    	if (!saveDirFile.exists()) {
			    		saveDirFile.mkdirs();
			    	}
					//写入文件
					PrintWriter pw=new PrintWriter(fileurl+"/"+className+".java","utf8");
					pw.write(sb.toString());
					pw.close();
					//TODO 生成配置文件信息
					csb.append("\n\t\t<!-- "+table.getTableNote()+" bean -->");
					csb.append("\n\t\t<typeAlias type=\""+config.getBeanPackage()+"."+className+"\" alias=\""+StrUtils.toLowerCaseFirstOne(className)+"\"/>");
					
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
		return csb;
	}
}
